SublimeSocket API Reference 1.1.3


Overview

SublimeTextのAPIを、WebSocket経由で実行するためのサーバです。

SublimeTextのプラグインとして実装されています。


WebSocket(RFC6455)によって、Local, Remoteの環境と組み合わせて動作します。


文章中では、SublimeTextのことをST、SublimeSocketのことをSSと略機することがあります。



用途

・SublimeSocketAPIを組み合わせてReactorをプログラミングし、ST上にログ情報を表示

・ST上での特定のアクションに応じてコンパイル処理を走らせる

・Remote環境のコンパイラとLocal環境のSTの連携

・端末上のWebSocketクライアントとSTの連携



想定している連携例

スクリーンショット 2013-04-05 13.27.48.png

サーバ側から、Log、StackTrace、SublimeSocketAPIなどの文字列データをSublimeSocketへと送付

SublimeSocketがデータ受信、API受付

SublimeTextに表示、編集アシスト動作


SublimeTextからキーイベント発行

SublimeSocket イベント着火

SublimeSocketからサーバ上のコンパイラにコンパイルオーダー

サーバ側でコンパイル


ずっとSublimeTextのターン!!



API記法について



SSJSON (SublimeSocketJSON)

JSONに特定の文字列をつけて、APIの実行キーにしています。

下記の文字で構成された文字列を受け取る事で、APIを実行します。


Prefix

API_PREFIX = "sublimesocket"

API_PREFIX_SUB = "ss"

特にSublimeServer向けの情報である事を示すPrefixです。

ぱっと見で明示するために付いています。

フルに書くのがめんどくさい場合、ssで済ます事が出来ます。



HeaderDelimiter

API_DEFINE_DELIM = "@"

ここから先がAPIのKeys and Values、という事を示すデリミタです。



Concat

API_CONCAT_DELIM = "->"

API同士を接続するデリミタです。

下記のように使用します。

ss@API->API->API

-> で連結したAPIは、記述順を守って実行されます。

Parameters

ss@Command1:JSON


ss@Command1:JSON->Command2:JSON->Command3:JSON,,,


JSON部分の内容は、各APIごとに必須パラメータ名、型が決められています。

また、パラメータ無しのAPIは、JSON部分無しで実行する事が出来ます。


ss@Command1



Comment

API_COMMENT_DELIM = "/"

@とAPI名の間に記述する事が出来ます。/で閉じます。


ss@コメント/API->...



値渡し

Returnが定義されているAPIの場合、

(SourceKey|TargetKey)をAPI名の前に書く事で、直前のAPIの結果値を渡すことが出来ます。

1.0では特定APIにしか対応していませんが、1.1では全APIで対応する予定です。

ss@commandA:{"key1":"value"}->(key1|key2)commandB:{"key2":"will be replaced."}

commandA の key1 に入った値を、commandB の key2 へと入力して実行します。



Sample API

下記は、STのログに "Hello World" を出すAPIのサンプルです。

ss@ハローワールドです/showAtLog:{"message":"Hello World"}


色々なAPIを、SublimeSocket Test Console で試す事が出来ます。

CommandPalette -> "SublimeSocket: on > open preference" で、SublimeTextからSafariなどブラウザが起動します。

スクリーンショット 2013-06-10 18.55.42.png

input に対してss@showAtLog:{"message":"Hello World"}を入力した状態でInputボタンを押すと、SublimeText内のコンソールに ss:Hello World と表示されているはずです。


c.png





API Reference



versionVerify

Client側から想定しているST、SSのVersionを入力し、SSのVersion、SSのAPIVersionとの整合性チェックを行います。

SSには、SS自体のversion と、SSのAPIのversionの2つのレイヤーがあります。


SSのversion = SublimeText 2 or 3 のどちらに対応しているか

SSAPIのversion = SublimeSocket API version


socketVersion[string]

Client側が想定しているSublimeSocketのversionの文字列です。"major.minor.changeLevel"

Client側の指定したversionと一致しない場合、そのクライアントとのコネクションは切断されます。


apiVersion[bool]

Client側が想定しているSSAPIのversionの文字列です。 "major.minor.changeLevel"


以下のケースが発生します。

major version について

client < server で切断、clientのupdateを促す

client = server でminorのチェックに入る

client > server で切断、SSのupdateを促す


minor version について

client < server で、OK、かつclientのupdateを促す(可能であれば)

client = server で、OK。

client > server で切断、SSのupdateを促す


e.g.

ss@versionVerify:

{

    "socketVersion": "0.0.1",

    "apiVersion": "0.0.1"

}



runSetting

テキストファイルとして保存されているAPIを読み込み、実行します。


path[string]

読み込むファイルのパスです。

SUBLIMESOCKET_PATH:と付ける事で、SublimeSocketフォルダ内を参照するようにショートカットができます。


e.g. /Users/someone/Desktop//UnityFilter.txt ファイルを読み込み、APIとして実行

ss@runSetting:

{

    "path": "/Users/someone/Desktop/UnityFilter.txt"

}



inputIdentity

SublimeSocket WebSocketのコネクションに名前をつける事が出来ます。


id[string]

コネクションに付ける名前です。

SSを中継して他Clientにメッセージを送る際などの宛名に使用します。


e.g. 送付元のClientのidをmyClientにする。

ss@inputIdentity:{"id":"myClient"}



tearDown

SSのWebSocket service を終了します。


e.g. SSのサーバを落とす。

ss@ tearDown

(バグがあり、socket自体はそのまま生存、address already use が出てしまう 2013/04/05 10:35:52)



setReactor

SublimeSocketに対して、特定のEventが発生した場合に動く、Reactorをセットします。

eventとtargetの組み合わせによって、特定のEventに対して複数の動作をセットすることが可能です。


event[string]

監視する対象のEvent名 "on_modified", "on_selection_modified", "on_pre_save", "on_post_save" など、

SublimeTextが発行するものと、

"event_"で始まる語句で、独自のイベントを定義できます。


target[string]

Reactorの識別に使用します。

異なるtargetを設定する事で、同じEventに対して複数のReactorをセットする事が出来ます。


selectors[JSONArray[JSONObject[string:any]]]

Event発生時に動作するAPIを記述できます。

記述はJSONの配列形式で、APIのCommand部分を文字列キーにしたJSonObjectが使えます。


interval[int]

実行間隔の数値です。

0であればセット直後に一度だけ対象Eventの発生をチェックします。

0以外の正の数であれば、ミリ秒ごとに対象Eventの発生をチェックします。


replacefromto[JSONObject[string:string]]

Reactor発生時、Eventの持つパラメータを、selectorで指定したAPIに適応させる事が出来ます。

{key:value}に対して、 Eventの持つkey名のパラメータの値を、selector内のvalue名のパラメータの値にします。


e.g. 選択範囲が更新されたら、STのログにHello Worldと表示する。1秒ごとに実行される

ss@setReactor:

{

    "target": "sublimesocketpreference",

    "event": "on_selection_modified",

    "selectors": [

        {

            "showAtLog": {

                "message": "Hello World"

            }

        }

    ],

    "replacefromto": {

        "view": "view"

    },

    "interval": 1000

}



setFoundationReactor

ST上で発生する特殊なEventに対してReactorをセットします。

Eventについては下記EventReference参照


event[string]

対象Event名です。”ss_f_noViewFound” などが該当します。

あるビュー(ファイル)に対する操作が発生したとき、そのビューが現在開かれていない際に発行されます。


条件があり、

・defineFilterが定義済み

・そのfilterにヒットするfilteriingが流入し

・対象ビューが探知できなかった

場合に発生します。


selectors

replacefromto

同 setReactor


e.g. Reactorセット後、フィルタ定義をし、そのフィルタにヒットするも該当するビューが開かれていない場合、STログにHello Worldを出力する。

ss@setFoundationReactor:

{

    "event": "ss_f_noViewFound",

    "selectors": [

        {

            "showAtLog": {

                "message": "Hello World"

            }

        }

    ]

}

->defineFilter:

{

    "name": "04/04/13 23:30:08",

    "patterns": [

        {

            "something": {

                "selectors": [

                    {

                        "showAtLog": {

                            "message": "Hello World"

                        }

                    }

                ]

            }

        }

    ]

}

->filtering:

{

    "name": "04/04/13 23:30:08",

    "source": "something"

}



kvs

SS内のKey value storeを扱うAPIです。

内部的にはPythonの辞書で実装されています。 この機能の実装は、そのまま別のKVSへとすげ替える事を念頭に隔離して実装されています。


showAll[string]

全パラメータを文字列にSerializeしてClientへと返します。

valueの意味はありません。


showValue[string]

valueにしたパラメータをkeyに持つ値を返します。

辞書や配列の場合、Serializeしたものを返します。


removeValue[string]

valueにしたパラメータをkvsから削除します。


clear[string]

kvsを空にします。

valueの意味はありません。


e.g. kvsを空にする。

ss@kvs:

{

    "clear": "true"

}



defineFilter

SSへとデータが流し込まれた際に反応するフィルタを定義します。

定義されたフィルタはkvsへと保存され、特定のデータに対して反応します。


name[string]

フィルタをidentifyするための文字列です。

filtering APIと合わせて使用します。


patterns[JSONArray[JSONObject[string:any]]]

正規表現をkeyにしたJSONObjectの配列です。

keyにマッチするデータが流入した場合、value内のselectorsがAPIとして発生します。


複数の正規表現を書いた場合、配列順に実行されます。

複数のフィルタにマッチすることを許します。


e.g. 2013/04/04 23:30:08 という名前で、somethingで始まるデータが流入した場合、STログにHello World を出力する。

ss@defineFilter:

{

    "name": "04/04/13 23:30:08",

    "patterns": [

        {

            "^something": {

                "selectors": [

                    {

                        "showAtLog": {

                            "message": "Hello World"

                        }

                    }

                ]

            }

        }

    ]

}



filtering

SSへとデータを流し込むAPIです。

任意の文字列データをClientからSSへと流し込みます。


name[string]

ターゲットとなるフィルタをidentifyする文字列です。

事前にdefineFilterでセットされている必要があります。


source[string]

文字列データです。

APIの都合上、JSONで扱えない文字と、-> (-と>の連続) が入っている文字列を扱う事が出来ません。

これらは事前にパースするとかでなんとかしてください。


debug[bool]

デバッグ用パラメータです。

セットされている場合はvalueに応じてデバッグ表示がSTのログに出力されます。


e.g. 2013/04/04 23:30:08 という名前が付けられたフィルタに対して、something という文字列を出力する。

ss@filtering:

{

    "name": "04/04/13 23:30:08",

    "source": "something"

}



containsRegions

通常、setReactorに内包して使用します。

特定のview(STで開かれているファイル)について、Reactorが指定したEventが発生したタイミングで、

エディタの選択範囲にSTのRegionが存在する場合、emitキーワードで指定したEventを発行します。

発行できるEventは、"event_" 句で始まっていればOKで、自由に定義できます。


Eventについては下記EventReference参照


view[string]

viewのファイルのパスです。


target[string]

この文字列をtargetとして持つsetReactorへと、Eventを発行します。


emit[string]

Event名の文字列です。

event_で開始していればOKです。 event_errorEmitted などが指定できます。


debug[bool]

デバッグ用パラメータです。

セットされている場合はvalueに応じてデバッグ表示がSTのログに出力されます。

e.g.  ファイル /Users/USERNAME/Library/Application Support/Sublime Text 2/Packages/SublimeSocket/SublimeSocketAPISettings.py に対して、

10行目にRegionが表示されます。

スクリーンショット 2013-04-05 0.19.31.png

そのRegionをカーソルが選択範囲に含んだ際、

sublimesocketpreference というtargetをもち、event_errorEmitted Eventに反応するReactorに対して、Eventを発行します。

viewパラメータは something Reactorのreplacefromtoによって、on_selection_modifiedが発生したviewへと置き換えられます。

Event発行後、event_errorEmitted に反応するReactorが発生し、Hello WorldがSTのログに出力され、 appendRegionの内容が実行されます。

b.png

ss@setReactor:

{

    "target": "sublimesocketpreference",

    "event": "on_selection_modified",

    "selectors": [

        {

            "containsRegions": {

                "view": "will be replace to specific view",

                "target": "sublimesocketpreference",

                "emit": "event_errorEmitted",

                "debug": true

            }

        }

    ],

    "replacefromto": {

        "view": "view"

    },

    "interval": 1000

}

->setReactor:

{

    "target": "sublimesocketpreference",

    "event": "event_errorEmitted",

    "selectors": [

        {

            "showAtLog": {

                "message": "Hello World"

            }

        }

    ]

}

->appendRegion:

{

    "view": "/Users/USERNAME/Library/Application Support/Sublime Text 2/Packages/SublimeSocket/SublimeSocketAPISettings.py",

    "identity": "03/12/13 18:46:17",

    "line": 10,

    "message": "herecomes daredevil",

    "condition": "keyword"

}



collectViews

STが開いているviewを収集し、kvsに保存します。


特にパラメータはありません。

SS起動時に自動的に呼ばれます。

→SS起動時に自動的に実行されるAPIは、SSパッケージ内の SublimeSocket.sublime-settings に記述されています。

"loadSettings" : ["collectViews"]


e.g. ST上で開いているviewを収集する。

ss@collectViews



runShell

SSからPythonを経由してシェルスクリプトを実行します。

bashなどの環境変数は引き継がれません。

main, delay, debug 以外の文字列 "-a" や "something" などは、 そのままコマンドラインで実行されます。

☆shell実行する都合上、value側に含まれるスペースを含む文字列 "a peaceful journey" などは、spaceが_に変換されます。

他にも、"[" -> "", "]" -> "",  "@s@s@" -> " " へと変換が発生します。

たとえばspaceを表示したい場合、SSへと入力する前の段階で、@s@s@ などに変換しておく必要があります。

これは " をエスケープして文字列を囲んだ場合でもきちんと発生します。


main[string]

コマンドラインの先頭に入る文字列です。


delay[int]

指定ミリ秒後に実行します。


debug

デバッグ用パラメータです。

セットされている場合はvalueに応じてデバッグ表示がSTのログに出力されます。


上記以外のkey[any]

value部分には、string, int, bool のほか、 JSONArray[any] の指定が可能です。


JSONObject形式で書いた場合、順がシャッフルされる可能性に注意してください。

また、key、valueともに、空文字の指定が可能です。


e.g. ruby gems "terminal-notifier"を実行します。文字列中のspaceは、_に強制的に変換されます。

JSONObject版 key value の内容が、コマンドラインのパラメータとして実行されます。key-valueペアの順は守られますが、ペア同士がどの順で記述されるかは未定義です。

ss@runShell:

{

    "main": "terminal-notifier",

    "-message": "\"Hello, this is my message\"",

    "-title": "\"Message Title\"",

    "-execute": "\"open -a 'Sublime Text 2.App'\"",

    "debug": true

}


JSONArray版 terminal-notifier -message "Hello,_this_is_my_message" -title "Message_Title" -execute "open_-a_'Sublime Text 2.App'" が実行されます。

ss@runShell:

{

    "main": "terminal-notifier",

    "-message": [

        "\"Hello, this is my message\"",

        "-title",

        "\"Message Title\"",

        "-execute",

        "\"open -a 'Sublime Text 2.App'\""

    ],

    "debug": true

}



broadcastMessage/monocastMessage

SSを介して、他のClientへとWebSocket経由でメッセージを飛ばします。

target

monocastMessageの場合のみ有効な、送付先のIdentityです。

inputIdentity を使う事で、Client側が自己申告できます。

実行時点でSS上に存在しないidentityを指定した場合、エラーが発生します。


message[string]

Clientへと送付される文字列です。


sender[stirng]

オプションです。

送付元の情報をidentifyする事が出来ます。

このキーがあることで、Clientへと到達する情報は、

senderのvalue:messageのvalue になります。


e.g.

ss@monocastMessage:

{

    "message": "here comes Daredevil! for only one",

    "target": "sublimesocketpreference"

}



showAtLog

文字列をSTのログに出力します。

主にユーザーへの通知や、動作確認に使用します。


message[string]

ログに出力される文字列です。


e.g.

ss@showAtLog:{"message":"Hello World"}


appendRegion

STで現在開かれている特定のviewへと、Region(四角形)を表示します。

情報はkvsのSUBDICT_REGIONS下に保存されます。 eraseAllRegions が発生したタイミングで、削除されます。


メッセージ情報他を埋め込むことができます。


view[string]

ファイル名を含むpathです。

フルパスが存在する場合、そのままviewを特定する要素として使用されます。

フルパスでない場合、適当に推測します。


最低でもファイル名.拡張子を含んでいる必要があります。

該当するviewがSTのview上に発見できなかった場合、”ss_f_noViewFound” Eventを発行します。


line[int]

Regionを表示する行番号です。


message[string]

Regionに保存する文字列データです。


condition[string]

Regionのカラーリングを決定するパラメータです。

STColor Schemeと連動しています。

SSでは、適当ですが、 keyword パラメータをError用、string パラメータをCaution用に使用しています。


e.g. ファイル /Users/USERNAME/Library/Application Support/Sublime Text 2/Packages/SublimeSocket/SublimeSocketAPISettings.py に対して、

10行目にRegionが表示されます。

1__#$!@%!#__スクリーンショット 2013-04-05 0.19.31.png

ss@appendRegion:

{

    "view": "/Users/USERNAME/Library/Application Support/Sublime Text 2/Packages/SublimeSocket/SublimeSocketAPISettings.py",

    "identity": "03/12/13 18:46:17",

    "line": 10,

    "message": "herecomes daredevil",

    "condition": "keyword"

}



runWithBuffer

SublimeTextでのファイル編集中のバッファを制御するために使用します。

他のAPIからviewを受け取り、そのviewのバッファに対して、ss_f_runWithBuffer イベントを発生させます。


view[sublimetext_view_instance]

SublimeTextのviewオブジェクトです。

インスタンスのため、APIから直に指定する事はできません。

e.g. 選択範囲が変更された際、現在のビューのバッファを ss_f_runWithBuffer イベントのReactorへと送付します。 

ss_f_runWithBuffer イベントのReactorがセットされていなければ何も発生しません。

ss@setReactor:

{

    "target": "sublimesocketpreference",

    "event": "on_selection_modified",

    "selectors": [

        {

            "runWithBuffer": {

                "view": "will be replace to specific view"

            }

        }

    ],

    "replacefromto": {

        "view": "view"

    },

    "interval": 100

}



notify

MacのNotificationCenterを起動し、任意の文字列を表示します。

スクリーンショット 2013-04-05 1.08.12.png

title[string]

タイトル用の文字列です。


message[string]

メッセージ用の文字列です。

"_"を" "(space)に勝手に変換します。


debug

デバッグ用パラメータです。

セットされている場合はvalueに応じてデバッグ表示がSTのログに出力されます。

e.g.

ss@notify:

{

    "title": "title-is-here",

    "message": "message-of-nyaaa"

}


補記: Linux、Windowsのことは考えずに作りましたが、下記サンプルでgrowlでの通知が可能です。

ss@runShell:

{

    "main": "/usr/local/bin/growlnotify",

    "-m": "message!",

    "-t": "Saved!",

    "-a": "\"Sublime Text 2\"",

    "debug": true

}



getAllFilePath

anchorに指定されたファイルを検索し、検索ヒット後、

ancorファイルがあるフォルダとその下のフォルダ内のすべてのファイルの絶対パスを,で連結した文字列をpathsに保持します。


anchor[string]

検索する対象のファイル名です。現在のSublimeTextのWindowBasePathを基準に、ファイルを上位階層へと探しに行きます。

特にリミットが無いため、間違えると永遠に上位フォルダへ検索の手を伸ばします。


header[string]

検索ヒット後、結果の文字列のfooterとして、pathsの前部に接続されます。


footer[string]

検索ヒット後、結果の文字列のfooterとして、pathsの後部に接続されます。


paths[string]

検索ヒット後、ヒット時のフォルダ以下にあるファイルすべてのpathを,で連結した、

header+連結済みpath+footer という状態の文字列を保持します。

e.g. readme.txtというファイルを検索し、そのファイルがあるフォルダ以下のすべてのファイルの絶対パスを,で連結した文字列をpathsに格納、

monocastMessageでクライアントへと送付します。

ss@getAllFilePath:

{

    "header": "header:",

    "anchor": "readme.txt",

    "footer": "footer",

    "paths": "will be entered"

}

->(paths|message)monocastMessage:

{

    "message": "replace",

    "target": "sublimesocketpreference"   

}

RESPONSE: header:/Users/sassembla/Library/Application Support/Sublime Text 2/Packages/SublimeSocket/tmp/preference.html,/Users/sassembla/Library/Application Support/Sublime Text 2/Packages/SublimeSocket/tmp/readme.txtfooter



readFileData

特定pathのファイルのデータを読み込みます。


path[string]

読み込み対象となるファイルのパス


data[string]

読み込んだデータが入力されます。


e.g. PythonSwitch.py というデータを読み出し、

monocastMessageでクライアントへと送付します。

ss@readFileData:

{

    "path": "/Users/sassembla/Library/Application Support/Sublime Text 2/Packages/SublimeSocket/PythonSwitch.py",

    "data": "will be entered"

}

->(data|message)monocastMessage:

{

    "message": "replace",

    "target": "sublimesocketpreference"  

}

RESPONSE: class PythonSwitch(object): def __init__(self, value): self.value = value self.fall = False def __iter__(self): """Return the match method once, then stop""" yield self.match raise StopIteration def match(self, *args): """Indicate whether or not to enter a case suite""" if self.fall or not args: return True elif self.value in args: # changed for v1.5, see below self.fall = True return True else: return False


eventEmit

独自定義のイベントを定義、発行します。

このAPIで着火できるイベントは、ユーザー定義イベントに限られます。


target[string]

Eventのターゲット指定に使用する文字列です。


event[string]

発行するEvent名です。 


e,g, MyTarget の event_MyEventというイベントに対するreactorをセットし、eventEmitでそのイベントを着火します。

ss@setReactor:

{

    "target": "MyTarget",

    "event": "event_MyEvent",

    "selectors": [

        {

            "monocastMessage": {

                "message": "eventEmit over.",

                "target": "sublimesocketpreference"

            }

        }

    ]

}

->eventEmit:

{

    "target": "MyTarget",

    "event": "event_MyEvent"

}

RESPONSE: eventEmit over.


openPage

SublimeTextと接続された状態のHTMLをブラウザで開きます。

HTMLはプラグイン内の tmp フォルダに、identity.htmlとして出力されます。


展開されたページは、SublimeSocket経由のmessageをログとしてHTMLに表示します。


Preferenceページの


identity[string]

展開されるページのWebSocketとしてのidentity指定です。

e.g. 06_10_13_14_32_08 というidentityを持ったページをブラウザで開きます。

展開されたページへは、monocastMessage, broadcastMessageでメッセージを届けることができ、HTML上に表示されます。

ss@openPage:

{

"identity": "06_10_13_14_32_08"

}



setWindowBasePath

SublimeTextで現在開いているファイルの位置を、SSのフォルダ検索の基準位置としてセットします。

ST2とST3で挙動が異なる(ST2だと非同期、ST3だと同期)


特にパラメータはありません。





Event Reference


各Eventについて、setReactor APIでReactorをセットする事が出来ます。

setReactorでcaptureできる各Eventが保持するパラメータについては、各Eventの項を確認してください。


SublimeText-Event

SublimeTextから発生するEventは下記になります。 発生タイミングなどの詳細は、同名のSublimeTextのAPI Referenceを参考にしてください。


on_selection_modified,  

on_pre_save, 

on_post_save, 

on_modified

これらのEventは、Reactorのinterval指定に従って発生判定を行っています。

一定時間内に複数回発生したとしても、最後に発生したEventのみが、intervalに合わせて処理されます。


REACTIVE_RESERVED_INTERVAL_EVENT = ["on_modified", "on_selection_modified", "on_pre_save", "on_post_save"]


Event params

すべてのEventが下記paramを発行します。

setReactorでは下記paramをreplacefromtoで転用可能。


view[sublimetext_view_instance]

SublimeText view


viewId[int]

SublimeText  view.view.id()


bufferId[int]

SublimeText view.buffer_id()


path[string]

SublimeText view.file_name()


basename[string]

os.path.basename(view.file_name())


vname[string]

SublimeText view.name()



SublimeSocket-Event

SublimeSocketから発生するEventは下記になります。

foundation series

emitEventなどでClientから発行することは不可能です。

setReactorに対して設定してください。



ss_f_noViewFound

appendRegion API使用時、該当のviewがSTのview内に存在しない = ファイルが開かれていない場合に発行されます。

発生したタイミングで、Reactorが反応します。



message[string]

view[string]

line[string]

condition[string]

パラメータはすべて、appendRegion APIへと入力された値が使用されます。

e.g. パラメータ例

{

    "view": "/Users/USERNAME/Library/Application Support/Sublime Text 2/Packages/SublimeSocket/SublimeSocketAPISettings.py",

    "identity": "03/12/13 18:46:17",

    "line": 10,

    "message": "herecomes daredevil",

    "condition": "keyword"

}



ss_f_runWithBuffer

runWithBuffer イベントの発生を受けて発生します。

runWithBuffer イベント発生時のviewパラメータを受け取り、バッファ上のデータをbodyパラメータに格納します。


target[string]

view[string]

body[string]

path[string]

パラメータはすべて自動的に入力されます。


e.g.  選択範囲が変更されると、そのビューのバッファの情報をbodyパラメータに格納し、monocastMessageでクライアントへと送付します。

サンプルとして、ファイル Default.sublime-commands を開いた状態で選択範囲を変更した際のRESPONSEを載せておきました。

ss@setReactor:

{

    "target": "sublimesocketpreference",

    "event": "ss_f_runWithBuffer",

    "replacefromto": {

        "body": "message"

    },

    "selectors": [

        {

            "monocastMessage": {

                "message": "replace",

                "target": "sublimesocketpreference"

            }

        }

    ]

}

->setReactor:

{

    "target": "sublimesocketpreference",

    "event": "on_selection_modified",

    "selectors": [

        {

            "runWithBuffer": {

                "view": "will be replace to specific view"

            }

        }

    ],

    "replacefromto": {

        "view": "view"

    },

    "interval": 100

}

RESPONSE: [ { "caption": "SublimeSocket: on", "command": "socketon" }, { "caption": "SublimeSocket: on > open preference", "command": "on_then_openpref" }, { "caption": "SublimeSocket: open preference", "command": "openpreference" }, { "caption": "SublimeSocket: status", "command": "statuscheck" }, { "caption": "SublimeSocket: off", "command": "socketoff" } ]





user-defined series

”event_”句から始まるユーザー独自定義のイベントを、emit パラメータがあるAPI経由か、emitEvent で発行することが可能です。

すべてのEventは、emit元が持つパラメータを持ちます。


e.g.

event_myEvent

event_emitHelloWorld

など、event_が付けばなんでもOKです。




saveなどのユーザー動作と組み合わせたEventの例

・setReactorでユーザーの on_post_save を監視

→発生時に動作するEventをselectorに定義


e.g. setReactorを使い、on_post_save Event発生時に、Hello World とSTのログへと出力します。

ss@setReactor:

{

    "target": "sublimesocketpreference",

    "event": "on_post_save",

    "selectors": [

        {

            "showAtLog": {

                "message": "Hello World"

            }

        }

    ],

    "interval": 1000

}




ユーザーによる範囲選択動作とRegionの選択を組み合わせたEventの例

・setReactorでユーザーの on_selection_modified Event を監視

→selector中で、containsRegions API をセット、

該当するview範囲に既設のRegionが含まれているかどうかチェックし、

適当なEventをemit


・setReactorで上記セットしたEventを監視

→selector中で任意の動作を行う


e.g. appendRegionで実際にRegionを発生させるサンプル。

on_selection_modifiedに反応するReactor内で、既設のRegionへの反応を記述。範囲がRegionを含んでいた場合、event_errorEmitted Eventを発行。

event_errorEmitted Eventが発行された場合、対応するReactorにて、showAtLogが発生する。

ss@setReactor:

{

    "target": "sublimesocketpreference",

    "event": "on_selection_modified",

    "selectors": [

        {

            "containsRegions": {

                "view": "will be replace to specific view",

                "target": "sublimesocketpreference",

                "emit": "event_errorEmitted",

                "debug": true

            }

        }

    ],

    "replacefromto": {

        "view": "view"

    },

    "interval": 1000

}

->setReactor:

{

    "target": "sublimesocketpreference",

    "event": "event_errorEmitted",

    "selectors": [

        {

            "showAtLog": {

                "message": "Hello World"

            }

        }

    ]

}

->appendRegion:

{

    "view": "/Users/sassembla/Library/Application Support/Sublime Text 2/Packages/SublimeSocket/SublimeSocketAPISettings.py",

    "identity": "03/12/13 18:46:17",

    "line": 10,

    "message": "herecomes daredevil",

    "condition": "keyword"

}




サンプルフィルタ

いくつか、サンプルのフィルタがあります。


TypeScript用のフィルタ

SublimeSocket/FilterSettingSamples/TypeScriptFilter.txt

tscが出力するログに対して、エラー行を表示しています。

すべてフィルタやReactorで書かれています。


API runSettingで読み込むとそのまま使える状態ですので、がんばってみてください。